package main

import "fmt"

/**
稀疏数组存储结构
*/
type sparsearr struct {
	row int
	col int
	val int
}

/**
稀疏数组

一、稀疏数组的存储结构
row  col  value
第0行存原始数组的大小规模（几行几列和默认值）
第0行以后存具体的有效值
*/
func main() {
	arr := getSourceArray(2, 3)
	fmt.Println("未压缩：", arr)

	//稀疏二维数组
	row := len(arr)
	col := len(arr[0])
	var sparse [][]int
	first := [][]int{
		{row, col, 0},
	}
	sparse = append(sparse, first[0])

	//遍历获取原始数组的规模
	for i := 0; i < len(arr); i++ {
		inline := arr[i]
		for j := 0; j < len(inline); j++ {
			if arr[i][j] != 0 {
				validarr := [][]int{
					{i, j, arr[i][j]},
				}
				sparse = append(sparse, validarr[0])
			}
		}
	}
	fmt.Println("压缩后", sparse)
	/*************将压缩数组还原***************/
	//s1 := sparse[0]
	//压缩数组的第一个元素标识的是 解压后数组的规模以及默认值
	/*
		0 1 2
		0 1 2
	*/
	var source = [2][3]int{}
	//fmt.Println("len", source)
	for i := 1; i < len(sparse); i++ {
		//inline := sparse[i]
		r := sparse[i][0]
		c := sparse[i][1]
		v := sparse[i][2]
		//validarr := [][]int{
		//	{r, c, v},
		//}
		//source = append(source, validarr[0])
		//fmt.Println(r, c, v)
		source[r][c] = v

	}
	fmt.Println("还原结果:", source)
}

/**
获取二维切片数据源
0 1 2
0 1 2
*/
func getSourceArray(row, col int) [][]int {

	var arr [][]int
	for i := 0; i < row; i++ {
		inline := make([]int, col)
		for j := 0; j < len(inline); j++ {
			inline[j] = j
		}
		arr = append(arr, inline)
	}
	return arr
}
